package dao;


import org.sqlite.SQLiteDataSource;

import javax.sql.DataSource;
import java.sql.*;

/**
 *  这是针对连接数据库的封装：连接和释放资源（关闭）
 */
public class DBUtil {

    /**
     *  注意这里用到之前学过的 多线程安全
     *  3步操作
     *  1. 两个 if 判断
     *  2. 加锁 synchronized
     *  3. 加上 volatile
     */

    // 利用单例模式，注意在多线程环境下的不安全
    public static volatile DataSource dataSource = null;

//    public static DataSource getDataSource() {
//        if(dataSource == null) {
//            dataSource = new SQLiteDataSource();
//            // 注意这里的 \ 要进行转义，或者直接使用 /
//            ((SQLiteDataSource)dataSource).setUrl("jdbc:sqlite://D:\\java\\Tools\\SQLite\\sqlite-tools-win32-x86-3420000\\fileSearcher.db");
//        }
//        return dataSource;
//    }

    public static DataSource getDataSource() {
        if(dataSource == null) {
            synchronized (DBUtil.class) {
                if (dataSource == null) {
                    dataSource = new SQLiteDataSource();
                    // 注意这里的 \ 要进行转义，或者直接使用 /
                    ((SQLiteDataSource) dataSource).setUrl("jdbc:sqlite://D:\\java\\Tools\\SQLite\\sqlite-tools-win32-x86-3420000\\fileSearcher.db");
                }
            }
        }
        return dataSource;
    }

    // 注意 Connection 的包是来自 java.sql.Connection; 不要找错了
    public static Connection getConnection() throws SQLException {
        // return dataSource.getConnection();
        // 注意上面这种写法会空指针异常
        return getDataSource().getConnection();
    }

    // public static void close(Connection connection, PreparedStatement statement, ResultSet resultSet) {
    public static void close(Connection connection, Statement statement, ResultSet resultSet) {
        // 需要先进行判断一下，利用三个 try catch，防止其中一个出问题，别的地方执行不到关闭操作
        // 释放资源，关闭连接 (按照创建的反方向的顺序开始释放资源)
        if(resultSet != null) {
            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if(statement != null) {
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if(connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}
